package com.raowb.common.util;

import java.util.HashMap;
import java.util.List;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;

/**
 * 
 * @Description: 单纯想创建现有的Mapper 例如:
 *               Db.getMapper(UserLoginMapper.class).selectById("14779707158513204");<br>
 * @author: raowb
 * @date 2018年8月8日
 * @param <T>
 */
@SuppressWarnings("all")
public class DbUtil<T> {

	/**
	 * 每个Db类，包装一个Mapper接口,这个clazz就是接口的类类型，例如UserMapper.class
	 */
	private Class<T> clazz;

	/**
	 * Mapper的父类接口
	 */
	private BaseMapper<?> baseMapper;

	/**
	 * 私有构造方法，不允许自己创建
	 */
	private DbUtil(Class clazz) {
		this.clazz = clazz;
		this.baseMapper = (BaseMapper<?>) SpringBeanUtil.getBean(clazz);
	}

	/**
	 * <p>
	 * 创建包含指定mapper的Db工具类,使用本类的第一种用法
	 *
	 * @param clazz mapper的类类型
	 * @date 2017年2月22日 下午10:09:31
	 */
	public static <T> DbUtil<T> create(Class<T> clazz) {
		return new DbUtil<T>(clazz);
	}

	/**
	 * <p>
	 * 获取一个mapper的快捷方法
	 *
	 * @param clazz mapper类的类对象
	 * @date 2017年2月22日 下午10:31:35
	 */
	public BaseMapper<?> getMapper() {
		return this.baseMapper;
	}

	/**
	 * <p>
	 * 获取一个mapper的快捷方法
	 *
	 * @param clazz mapper类的类对象
	 * @date 2017年2月22日 下午10:31:35
	 */
	public static <T> T getMapper(Class<T> clazz) {
		return SpringBeanUtil.getBean(clazz);
	}

	/**
	 * 通过一个条件获取数据库中的一条记录(会返回null)
	 *
	 * @date 2017年2月22日 下午10:45:51
	 */
	public <E> E selectOneByCon(String condition, Object value) {
		List<?> results = selectOneByConList(condition, value);
		if (results != null && results.size() > 0) {
			return (E) results.get(0);
		} else {
			return null;
		}
	}

	/**
	 * 通过一个条件获取一堆记录(会返回null)
	 *
	 * @date 2017年2月22日 下午10:45:51
	 */
	public <E> List<E> selectOneByConList(String condition, Object value) {
		HashMap<String, Object> conditionMap = new HashMap<String, Object>();
		conditionMap.put(condition, value);

		List<E> results = (List<E>) this.baseMapper.selectByMap(conditionMap);
		if (results == null || results.size() == 0) {
			return null;
		} else {
			return results;
		}
	}
}
